今天介紹第三種生成模式 - factory method (工廠模式)
這個模式的目的是,在定義一個生成物件的介面時,能夠讓子類別決定生成物件的過程中該具現化哪種類別物件。
將具現化過程延伸到子類別,讓子類決定去修改、處置具現化流程中該產生何種物件。
白話的說,這個模式主要是在處理一個情境,就是當我今天寫了一個負責專門生成別人物件的一個class,我今天想要抽換生成的物件類別要怎麼做。
這裡的[專門生成別人物件]指的是生成一個複雜的大物件,裡面有很多小物件等等。
這個模式的架構圖如下 :
圖片來源 (https://refactoring.guru/design-patterns/factory-method)
其中,我們的重點著重在那個Creator以及所有衍生的ConcreteCreator
想盡辦法讓Creator可以生成product(如果不是abstract class),ConcreteCreator可以生成ConcreteProduct
這裡繼續沿用之前的abstract factory手機工廠例子
現在模板工廠介面長這樣
模板工廠有一個生產流程的介面,以及手機零件的虛擬函數
class abstractSmartphoneFactory {
public:
smartPhone* producePhone(){
smartPhone phone = new smartPhone;
phone.addPart( getDisplay() );
phone.addPart( getChipset() );
phone.addPart( getOs() );
phone.addPart( getBaseboard() );
return phone;
}
virtual display* getDisplay() { cout << "LED display"; }
virtual chipset* getChipset() { cout << "mediaTek chipset"; }
virtual operatingSystem* getOs() { cout << "android OS"; }
virtual baseboard* getBaseboard(){ cout << "public baseboard"; }
};
當今天apple公司委託代工廠蓋了一間專屬手機工廠
他要使用自己的chipset, OS, display,所以他必須替換掉模板工廠提供的基本零件解決方案
所以他覆寫了parent class之中手機零件的函數
class appleFactory() : public abstractSmartphoneFactory {
public:
display* getDisplay() override { cout << "apple OEM amoled"; }
chipset* getChipset() override { cout << "A series chipset"; }
operatingSystem* getOs() override { cout << "apple iOS"; }
};
所以屬於蘋果的代工廠製造的手機,就會是自己的晶片、螢幕還有作業系統了!
int main(){
abstractSmartphoneFactory* factory = new appleFactory;
factory->productPhone(); // a phone with apple's display, OS and chipset
return 0;
}